package sdk
import (
"bytes"
"encoding/json"
"errors"
"strconv"
"strings"
)
type BoolString struct {
Flag bool
Value string
}
func (s *BoolString ) UnmarshalJSON (raw []byte ) error {
if raw == nil || bytes .Equal (raw , []byte (`"null"` )) {
return nil
}
var (
tmp string
err error
)
if raw [0 ] != '"' {
if bytes .Equal (raw , []byte ("true" )) {
s .Flag = true
return nil
}
if bytes .Equal (raw , []byte ("false" )) {
return nil
}
return errors .New ("bad boolean value provided" )
}
if err = json .Unmarshal (raw , &tmp ); err != nil {
return err
}
s .Value = tmp
return nil
}
func (s BoolString ) MarshalJSON () ([]byte , error ) {
if s .Value != "" {
var buf bytes .Buffer
buf .WriteRune ('"' )
buf .WriteString (s .Value )
buf .WriteRune ('"' )
return buf .Bytes (), nil
}
return strconv .AppendBool ([]byte {}, s .Flag ), nil
}
type BoolInt struct {
Flag bool
Value *int64
}
func (s *BoolInt ) UnmarshalJSON (raw []byte ) error {
if raw == nil || bytes .Equal (raw , []byte (`"null"` )) {
return nil
}
var (
tmp int64
err error
)
if tmp , err = strconv .ParseInt (string (raw ), 10 , 64 ); err != nil {
if bytes .Equal (raw , []byte ("true" )) {
s .Flag = true
return nil
}
if bytes .Equal (raw , []byte ("false" )) {
return nil
}
return errors .New ("bad value provided" )
}
s .Value = &tmp
return nil
}
func (s BoolInt ) MarshalJSON () ([]byte , error ) {
if s .Value != nil {
return strconv .AppendInt ([]byte {}, *s .Value , 10 ), nil
}
return strconv .AppendBool ([]byte {}, s .Flag ), nil
}
func NewIntString (i int64 ) *IntString {
return &IntString {
Value : i ,
Valid : true ,
}
}
type IntString struct {
Value int64
Valid bool
}
func (v *IntString ) UnmarshalJSON (raw []byte ) error {
if raw == nil || bytes .Equal (raw , []byte (`"null"` )) || bytes .Equal (raw , []byte (`""` )) {
return nil
}
strVal := string (raw )
if rune (raw [0 ]) == '"' {
strVal = strings .Trim (strVal , `"` )
}
i , err := strconv .ParseInt (strVal , 10 , 64 )
if err != nil {
return err
}
v .Value = i
v .Valid = true
return nil
}
func (v *IntString ) MarshalJSON () ([]byte , error ) {
if v .Valid {
strVal := strconv .FormatInt (v .Value , 10 )
return []byte (strVal ), nil
}
return []byte (`"null"` ), nil
}
func NewFloatString (i float64 ) *FloatString {
return &FloatString {
Value : i ,
Valid : true ,
}
}
type FloatString struct {
Value float64
Valid bool
}
func (v *FloatString ) UnmarshalJSON (raw []byte ) error {
if raw == nil || bytes .Equal (raw , []byte (`"null"` )) || bytes .Equal (raw , []byte (`""` )) {
return nil
}
strVal := string (raw )
if rune (raw [0 ]) == '"' {
strVal = strings .Trim (strVal , `"` )
}
i , err := strconv .ParseFloat (strVal , 64 )
if err != nil {
return err
}
v .Value = i
v .Valid = true
return nil
}
func (v *FloatString ) MarshalJSON () ([]byte , error ) {
if v .Valid {
strVal := strconv .FormatFloat (v .Value , 'g' , -1 , 64 )
return []byte (strVal ), nil
}
return []byte (`"null"` ), nil
}
type StringSliceString struct {
Value []string
Valid bool
}
func (v *StringSliceString ) UnmarshalJSON (raw []byte ) error {
if raw == nil || bytes .Equal (raw , []byte (`"null"` )) {
return nil
}
var str string
if err := json .Unmarshal (raw , &str ); err == nil {
v .Value = []string {str }
v .Valid = true
return nil
}
var strSlice []string
err := json .Unmarshal (raw , &strSlice )
if err != nil {
return err
}
v .Value = strSlice
v .Valid = true
return nil
}
func (v *StringSliceString ) MarshalJSON () ([]byte , error ) {
if !v .Valid {
return []byte (`"null"` ), nil
}
return json .Marshal (v .Value )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .